package com.lang.string;

import org.junit.Test;

import java.nio.charset.Charset;
import java.util.Arrays;

/**
 * Created by yangliwei on 2018/3/28.
 */
public class Stringdemo {
    public static void main(String[] args) {
        String[] s = {"bbb","aaa","ab"};
        Arrays.sort(s);
        System.out.println(s[0]+" "+s[1]+" "+s[2]);
    }


    @Test
    public void StringPool(){
//        s1 和 s2 采用 new String() 的方式新建了两个不同字符串，而 s3 和 s4 是通过 s1.intern() 方法取得一个字符串引用。intern() 首先把 s1 引用的字符串放到 String Pool 中，然后返回这个字符串引用。因此 s3 和 s4 引用的是同一个字符串。
        String s1 = new String("aaa");
        String s2 = new String("aaa");
        System.out.println(s1 == s2);           // false
        String s3 = s1.intern();
        String s4 = s1.intern();
        System.out.println(s2 == s3);           //false
        System.out.println(s3 == s4);           // true

//        如果是采用 "bbb" 这种字面量的形式创建字符串，会自动地将字符串放入 String Pool 中。
        String s5 = "bbb";
        String s6 = "bbb";
        System.out.println(s5 == s6);  // true

    }

    /**
     * 输出为999，replace  如果target为空字符串的话，会将每个字符之间与字符串首位位置添加上replacement字符串
     */
    @Test
    public void testReplace(){
        String s = "12343214";
        //只替换第一个正则匹配到的数据，与replaceAll类似
        System.out.println(s.replaceFirst("", "9"));
        //替换所有匹配到的字符
        String replace = s.replace("", "9");
        System.out.println(replace);
    }

    @Test
    public void testReplaceAll(){
        String s = "1234321.4.";
        //替换正则匹配到的所有数据
        String replaceAll = s.replaceAll(".", "9");
        //替换匹配到的字符
        String replace = s.replace(".", "9");
        System.out.println(replaceAll);
        System.out.println(replace);
    }


    /**
     * 测试index方法
     * 查看子串在第几位
     */
    @Test
    public void testIndex(){
        String t = "abcdfg";
        System.out.println(t.indexOf("abc"));
        System.out.println(t.indexOf("bc"));
        System.out.println(t.indexOf("hh"));
        System.out.println("ywz2699196489_AA".indexOf("ywz2699196489"));
        System.out.println("ywz2699196489".indexOf("ywz2699196489_AA"));
    }

    @Test
    public void testNull(){
        String a= "" ;
        String b = null;
        String c = "";
        String s = "s";
        StringBuilder sb = new StringBuilder();
        p(a, b, c, s);
    }
    public void p(String a,String b,String c,String s){
        System.out.println(s+a+s+b+s+c+s);
    }


    /**
     * 比较两个字符串的子串是否相等
     */
    @Test
    public void testRegionMatches(){
        String orgin = "abcdEEEEEEee";
        String other = "bcdE";
        // orgin 从第二个字符串开始且长度为3 与other字符串第一个开始 长度为3 比较
        boolean flag = orgin.regionMatches(true, 1, other, 0,3);
        System.out.println(flag);
    }


    @Test
    public void testA(){

        String start_date = "20181001";
        System.out.println(start_date.substring(0,start_date.length()-2));

        String ss = "JT609001520400003720190402999905";
        System.out.println(ss.substring(2,ss.length()));

        String imei = "17757824576:8986031704578241820";
        String number = "17757824576";
        imei = imei.replaceFirst("\\[number\\]", number);
        // 更改主号的位置，放到最后
        int mainNumIndex = imei.indexOf(number);
        if (mainNumIndex != -1) {
            int sepaIndex = imei.indexOf(";", mainNumIndex);
            if (sepaIndex != -1) {
                String str = imei.substring(mainNumIndex, sepaIndex + 1);
                String imeiNew = imei.replace(str, "") + ";" + str;
                imeiNew = imeiNew.substring(0, imeiNew.length() - 1);
//                order_detail.setImei(imeiNew);
//                order_detail.update();
                // 取出主号的卡号 更新到pr_real_name_images_info 的iccid字段
                String card = imeiNew.substring(imeiNew.lastIndexOf(":") + 1);
//                updateCardToRealNameTable(mainId, number, card);
            } else {
//                order_detail.setImei(imei);
//                order_detail.update();
                // 取出主号的卡号 更新到pr_real_name_images_info 的iccid字段
                String card = imei.substring(imei.lastIndexOf(":") + 1);
//                updateCardToRealNameTable(mainId, number, card);
            }
        } else {
            imei = imei + ";" + number + ":[card]";
//            order_detail.setImei(imei);
//            order_detail.update();
        }
    }


    @Test
    public void testGetBytes(){
        String ss = "哈哈哈";
        ss.getBytes(Charset.forName("UTF-8"));
    }

    /**
     * null 强制转化之后不是为 "null" 字符串
     */
    @Test
    public void  test001(){
        String aa = null;
        String ss =  (String) aa;
        if(ss == null){
            System.out.println("yes");
        }
        System.out.println(ss);
    }


    /**
     * 比较 “10” 和“5” 5比较大
     */
    @Test
    public void test002(){
        System.out.println("10".compareTo("5"));
        System.out.println("6".compareTo("5"));
    }

    /**
     * 两个字符串相加
     */
    @Test
    public void test003(){
        String a = "0";
        String b = "0";
        System.out.println(a+b);
    }

    /**
     * a,b,c,, 这个我们预期长度应该是5，实际长度为3 后面两个为空的不算进去了
     * a,,b,c, 长度为4
     * splite方法对后面为空的值进行截断，就不进行操作了。
     */
    @Test
    public void Testsplite(){
        String a = "a,b,c,,";
//        a ="a";
        String[] s = a.split(",");
        System.out.println("s length "+ s.length);
        for( int i=0 ;i<s.length;i++){
            System.out.println(s[i]);
        }
    }


    /**
     * intern方法和字符串常量池
     * 当调用 intern 方法时，如果字符串常量池已经包含一个等于此 String 对象的字符串（用 equals(Object) 方法确定），
     * 则返回池中的字符串。否则，将此 String 对象添加到池中，并返回此 String 对象的引用。
     * 当且仅当 s.equals(t) 为 true 时，s.intern() == t.intern() 为 true
     */
    @Test
    public void test01(){
        String hello = "hello";//先查看字符串常量池里面是否有"hello"这个字符串,如果有的化,赋值给变量hello,否则的化,在常量池里面新建一个"hello"字符串常量,赋值给变量hello
        String hello1 = new String("hello");//无论字符串常量池中是否有"hello"都直接在内存中新建一个字符串常量"hello",所以hello==hello1为false,因为两个的引用不一样
        System.out.println("hello==hello1 : ");
        System.out.println(hello== hello1);
        //不知道为什么把这两句写道一个sout里面,里面输出的内容就出错
//        System.out.println("hello==hello1.intern: "+hello==hello1.intern());
        System.out.println("hello==hello1.intern: ");
        System.out.println(hello==hello1.intern());

        //当两个常量字符串相加的时候,默认结果也是先加入到常量池,若包含常量字符串的变量,则是直接在内存中new一个常量字符串
        String lo = "lo";
        String hello2= "hel"+"lo";//和hello都指向字符串常量池里面的"hello"字符串
        String hello3 = "hel"+lo;
        System.out.println("hello==hello2: ");
        System.out.println(hello==hello2);
        System.out.println("hello==hello3: ");
        System.out.println(hello==hello3);
        System.out.println("hello2==hello3: ");
        System.out.println(hello2==hello3);
    }
}
